// 引入three.js
import * as THREE from 'three';
// 导入附加组件-轨道控制器
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
// 引入CSS3渲染器CSS3DRenderer
import { CSS3DRenderer } from 'three/addons/renderers/CSS3DRenderer.js';
// 引入CSS3模型对象CSS3DObject
// import { CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';

export let scene, camera, renderer, controls, css3DRenderer

// 1.初始化三要素
export function init () {
  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(15, window.innerWidth / window.innerHeight, 0.1, 1000);
  // 移动相机位置
  camera.position.set(0, 0, 200);
  camera.lookAt(new THREE.Vector3(0, 0, 0));
  // 添加抗锯齿效果
  renderer = new THREE.WebGLRenderer({ antialias: true });
  // 给画布设置宽高
  renderer.setSize(window.innerWidth, window.innerHeight);
  // threeDemoRef.value.appendChild(renderer.domElement);
  document.body.appendChild(renderer.domElement);
}

// 2.创建轨道控制器
export function createControls () {
  controls = new OrbitControls(camera, renderer.domElement);
  // 开启阻尼惯性
  controls.enableDamping = true;
  // 阻尼速度
  controls.dampingFactor = 0.1;
  // 开启旋转
  // controls.autoRotate = true;
  // 旋转的速度
  // controls.autoRotateSpeed = 1;
  // 视角最小距离
  // controls.minDistance = 20;
  // 视角最远距离
  // controls.maxDistance = 5000;
  // 最大角度
  controls.maxPolarAngle = Math.PI / 3;
}

// 3.初始化灯光
export function initLight () {
  //模拟远处类似太阳的光源
  const directionalLight = new THREE.DirectionalLight(0xffffff, 1); //模拟远处类似太阳的光源
  directionalLight.position.set(3, 500, 10).normalize();
  scene.add(directionalLight);
  //影响整个场景的光源
  const ambient = new THREE.AmbientLight(0xffffff, 1);
  ambient.position.set(0, 500, 10);
  scene.add(ambient);
}

// 4.创建CSS3D渲染器
export const createCSS3DRenderer = () => {
  // 创建一个CSS3渲染器CSS3DRenderer
  css3DRenderer = new CSS3DRenderer();
  css3DRenderer.setSize(180, 220);
  // HTML标签<div id="dialog"></div>外面父元素叠加到canvas画布上且重合
  css3DRenderer.domElement.style.position = 'absolute';
  css3DRenderer.domElement.style.top = '0';
  // css3DRenderer.domElement.style.left = '0px';
  //设置.pointerEvents=none，解决HTML元素标签对threejs canvas画布鼠标事件的遮挡
  css3DRenderer.domElement.style.pointerEvents = 'none';
  // threeDemoRef.value.appendChild(css3DRenderer.domElement);
  document.body.appendChild(css3DRenderer.domElement);
};

// 5.1监测div的尺寸变化(是否大屏/全屏)
export const watchDom = () => {
  let ro = new ResizeObserver(() => {
    updateRelatedProperties()
  });
  // ro.observe(threeDemoRef.value);
  ro.observe(document.body);
};

// 5.2监听浏览器窗口的缩放
export function renderResize () {
  window.addEventListener('resize', () => {
    updateRelatedProperties()
  });
}

// 6.循环渲染
export function renderLoop () {
  renderer.shadowMap.enabled = true; // 开启阴影
  // 修改背景颜色
  renderer.setClearColor('#001c55', 1.0);
  // 实时更新性能
  // stats.update();
  controls.update();
  renderer.render(scene, camera);
  css3DRenderer.render(scene, camera);
  requestAnimationFrame(renderLoop);
}


// 公共函数
function updateRelatedProperties () {
  // 更新画布宽高
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 更新相机的宽高比
  camera.aspect = window.innerWidth / window.innerHeight;
  // 更新相机的近截面和远截面
  camera.updateProjectionMatrix();
  // HTML标签css3Renderer.domElement尺寸重新设置
  css3DRenderer.setSize(window.innerWidth, window.innerHeight);
}